﻿'''
题目描述
现有一个机器人，可放置于M × N的网格中任意位置，每个网格包含一个非负整数编号，当相邻网格的数字编号差值的绝对值小于等于
1 时，机器人可以在网格间移动。
问题： 求机器人可活动的最大范围对应的网格点数目。
说明：网格左上角坐标为 (0,0) ,右下角坐标为(m−1,n−1)，机器人只能在相邻网格间上下左右移动
输入描述
第 1 行输入为 M 和 N
M 表示网格的行数
N 表示网格的列数
之后 M 行表示网格数值，每行 N 个数值（数值大小用 k 表示），数值间用单个空格分隔，行首行尾无多余空格。
M、 N、 k 均为整数
1 ≤ M，N ≤ 150,
0 ≤ k ≤ 50
输出描述
输出 1 行，包含 1 个数字，表示最大活动区域的网格点数目，
行首行尾无多余空格。
示例1
输入
4 4
1 2 5 2
2 4 4 5
3 5 7 1
4 6 2 4
输出
6
示例2
输入
2 3
1 3 5
4 1 3
输出
1
任意两个相邻网格的差值绝对值都大于1，机器人不能在网格间移动，只能在单个网格内活动，对应网格点数目为1
解题思路
使用BFS求最大连通分量，规则：当相邻网格的数字编号差值的绝对值小于等于 1 时
'''
# 定义四个可能的移动方向：右，左，下，上
directions = [[0, 1], [0, -1], [1, 0], [-1, 0]]

# 使用深度优先搜索（DFS）来探索网格
def dfs(matrix, visited, x, y):
    # 标记当前网格点为已访问
    visited[x][y] = True
    # 初始化当前网格点的范围计数为1
    range = 1
    # 遍历所有可能的移动方向
    for direction in directions:
        newX = x + direction[0]  # 计算新的行坐标
        newY = y + direction[1]  # 计算新的列坐标
        # 检查新坐标是否在网格内部，且未访问过，并且满足编号差值绝对值小于等于1的条件
        if newX >= 0 and newX < len(matrix) and newY >= 0 and newY < len(matrix[0]) \
            and not visited[newX][newY] and abs(matrix[newX][newY] - matrix[x][y]) <= 1:
            # 递归地继续探索并累加可活动的网格点数目
            range += dfs(matrix, visited, newX, newY)
    # 返回从当前网格点出发可活动的最大网格点数目
    return range

# 读取输入数据
m,n = map(int,input().split())
matrix = []  # 初始化网格矩阵

# 逐行读取输入
for _ in range(m):
    matrix.append(list(map(int,input().split())))

# 寻找机器人可以活动的最大范围
maxRange = 0
for i in range(m):
    for j in range(n):
        visited = [[False] * n for _ in range(m)]  # 初始化访问标记数组
        ranges = dfs(matrix, visited, i, j)  # 对每个网格点执行DFS
        maxRange = max(maxRange, ranges)  # 更新最大活动范围

# 输出机器人可以活动的最大范围对应的网格点数目
print(maxRange)
